package com.zq.solution;

/**
 * @ClassName MoveZeroes
 * @Description
 * 283. 移动零
 *   给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 示例:
 *   输入: [0,1,0,3,12]
 *   输出: [1,3,12,0,0]
 * 说明:
 *   必须在原数组上操作，不能拷贝额外的数组。
 *   尽量减少操作次数。
 * @Author ZQ
 * @Date 2020/11/19 9:06
 * @Version 1.0
 */
public class MoveZeroes {
    public static void moveZeroes1(int[] nums) {//此方法忘记题设里面，保持其他元素的相对顺序，所以解答不对
        int i = 0, j = nums.length - 1;
        while (i < j){
            if (nums[i] == 0 && nums[j] != 0){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
                i++;j--;
            }else if (nums[i] == 0 && nums[j - 1] == 0) j--;
            else i++;
        }
        printArr(nums);
    }

    public static void moveZeroes2(int[] nums) {
        for (int i = 0; i < nums.length; i++){
            if (nums[i] != 0) continue;
            for (int j = i + 1; j < nums.length;j++){
                if (nums[i] == 0 && nums[j] != 0){
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                }

            }
        }
        printArr(nums);
    }

    public static void moveZeroes3(int[] nums) {//官方版本
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                left++;
            }
            right++;
        }

        printArr(nums);
    }

    public static void main(String[] args) {
        int[] nums = new int[]{0,1,0,3,12};
        moveZeroes3(nums);
    }

    public static void printArr(int[] nums){
        for (int n : nums){
            System.out.print(n + ",");
        }
    }
}
